package com.zjj.learn.designmodel.work.observer;

public class ObserverTest {

    public static void main(String[] args) {
        //创建两个观察者
        WeChatUser user1 = new WeChatUser("张三");
        WeChatUser user2 = new WeChatUser("小美");
        //定义一个具体主题
        BookSubject subject = new BookSubject();
        //让观察者订阅主题信息
        subject.follow(user1);
        subject.follow(user2);

        subject.addMessage("今天发布了新书《为爱和平》");
        System.out.println("****************");
        //user1 取消订阅
        subject.unFollow(user1);
        subject.addMessage("又发布了新书《西游记》");

    }

    /**
     * 观察者模式的使用
     * 观察者模式也是一种行为型模式，是一种一对多关系的模式
     * 观察者模式让多个观察者观察同一个主题对象，当主题对象发生变化时，会通知所有的观察者对象
     *
     * 在观察者模式中，主题对象（被观察者）负责维护一个观察者列表并提供注册和删除观察者的方法。
     * 而观察者对象则实现一个更新方法，当其所关注的主题对象发生变化时，更新方法会得到调用，以便让观察者可以取得最新的信息。
     *
     * 观察者模式的组成：
     *   1、抽象主题
     *   2、具体主题
     *   3、抽象观察者
     *   4、具体观察者
     *
     * 举例：
     *     在微信公众号应用中，假设多个用户订阅了一个公众号。那么当公众号发布消息时就需要向所有订阅用户发送提示信息。
     *
     * 在上面的案例中：
     *     1、抽象主题就是公众号，有订阅、取消订阅和发送消息的方法
     *        {@link com.zjj.learn.designmodel.work.observer.Subject}
     *     2、具体主题，实例一个具体的公众号，比如和图书有关的公众号
     *        {@link com.zjj.learn.designmodel.work.observer.BookSubject}
     *     3、抽象观察者就是用户这个概念
     *        {@link com.zjj.learn.designmodel.work.observer.Observer}
     *     4、具体观察者就是实例的每一个用户，需要实现继承获实现抽象观察者
     *        {@link com.zjj.learn.designmodel.work.observer.WeChatUser}
     *
     *
     *
     *
     **/
}
